package arp.analiseprestadores.gui.relatorio;

import arp.analiseprestadores.FachadaARP;
import arp.analiseprestadores.model.Prestador;
import arp.analiseprestadores.util.Configuracao;
import arp.analiseprestadores.util.ConstantesARP;
import arp.analiseprestadores.util.UtilARP;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 *
 * @author maddogxx
 */
public final class RelatorioConciliacaoPrestadores {
    private static final Logger LOGGER = Logger.getLogger(RelatorioConciliacaoPrestadores.class);

    public static String gerar() throws Exception {
        String nomeArquivo = ConstantesARP.NOME_ARQUIVO_RELATORIO.replaceAll("#1", UtilARP.getTimestampAtualString());
        String arquivoSaida = Configuracao.getInstancia().getDiretorioRelatorio() + "\\" + nomeArquivo;
        
        LOGGER.warn("O arquivo " + arquivoSaida + " será gerado");
        
        XSSFWorkbook workBook = new XSSFWorkbook();
        
        XSSFCellStyle estilo = workBook.createCellStyle();
        XSSFFont font = workBook.createFont();
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        estilo.setFont(font);
        
        List<Prestador> prestadores = FachadaARP.getInstancia().consultarDiferencaPrestadoresOrigemDestino();
        
        criarFolha(workBook, estilo, ConstantesARP.ABA_DADOS_SOMENTE_ORIGEM, prestadores);
        
        prestadores = FachadaARP.getInstancia().consultarDiferencaPrestadoresDestinoOrigem();
        
        criarFolha(workBook, estilo, ConstantesARP.ABA_DADOS_SOMENTE_DESTINO, prestadores);
        
        List<Map<String, String>> mapaPrestadores = FachadaARP.getInstancia().consultarInterseccaoPrestadores();
        
        criarFolhaMesclado(workBook, estilo, ConstantesARP.ABA_DADOS_MESCLADOS, mapaPrestadores);

        FileOutputStream saida = new FileOutputStream(arquivoSaida);
        
        workBook.write(saida);
        saida.close();
        
        return nomeArquivo;
    }
    
    private static void criarFolha(XSSFWorkbook workBook, XSSFCellStyle estilo, String nomeFolha, List<Prestador> prestadores) {
        LOGGER.warn("Criando a folha " + nomeFolha);
        int contadorLinha = 0;
        // Cabeçalho
        XSSFSheet folha = workBook.createSheet(nomeFolha);
        XSSFRow linha = folha.createRow(contadorLinha);
        
        XSSFCell celula = linha.createCell(0);
        celula.setCellStyle(estilo);
        celula.setCellValue(ConstantesARP.RELATORIO_COLUNA_DOCUMENTO);
        
        celula = linha.createCell(1);
        celula.setCellStyle(estilo);
        celula.setCellValue(ConstantesARP.RELATORIO_COLUNA_NOME);        
        
        contadorLinha++;
        
        for (Prestador prestador : prestadores) {
            LOGGER.warn(prestador);
            
            linha = folha.createRow(contadorLinha);
            
            linha.createCell(0).setCellValue(UtilARP.adicionarMascara(prestador.getDocumento()));
            linha.createCell(1).setCellValue(prestador.getNome());
            
            contadorLinha++;
        }

    }
    
    private static void criarFolhaMesclado(XSSFWorkbook workBook, XSSFCellStyle estilo, String nomeFolha, List<Map<String, String>> prestadores) {
        LOGGER.warn("Criando a folha " + nomeFolha);
        int contadorLinha = 0;
        // Cabeçalho
        XSSFSheet folha = workBook.createSheet(nomeFolha);
        XSSFRow linha = folha.createRow(contadorLinha);
        
        XSSFCell celula = linha.createCell(0);
        celula.setCellStyle(estilo);
        celula.setCellValue(ConstantesARP.RELATORIO_COLUNA_DOCUMENTO);
        
        celula = linha.createCell(1);
        celula.setCellStyle(estilo);
        celula.setCellValue(ConstantesARP.RELATORIO_COLUNA_NOME_ORIGEM);
        
        celula = linha.createCell(2);
        celula.setCellStyle(estilo);
        celula.setCellValue(ConstantesARP.RELATORIO_COLUNA_NOME_DESTINO);        
        
        contadorLinha++;
        
        for (Map<String, String> prestador : prestadores) {
            LOGGER.warn(prestador);
            
            linha = folha.createRow(contadorLinha);

            linha.createCell(0).setCellValue(UtilARP.adicionarMascara(prestador.get(ConstantesARP.NOME_COLUNA_DOCUMENTO)));
            linha.createCell(1).setCellValue(prestador.get(ConstantesARP.NOME_COLUNA_ORIGEM));
            linha.createCell(2).setCellValue(prestador.get(ConstantesARP.NOME_COLUNA_DESTINO));
            
            contadorLinha++;
        }
        
    }
    
}
